// 题意： 给定n个集合，每次可以将某两个集合合并，也可以询问第k大的集合的大小。
//
// 题解：用树状数组，维护size为id的个数，统计第k大的时候先转为第k小，
//       求第k小的数就是树状数组维护前n个数频率和加起来小于k的最大位置，
//       答案就是这个位置加1, 可以充分利用树状数组的二进制操作。
//       另外，，两个版本的sbt都TLE。
//
// run: $exec < input
#include <cstdio>

struct node
{
	int f;
	int bit;
};

int const maxn = 200007;
int bit[maxn];
int parent[maxn];
int size[maxn];
int n, m, num;

int lowbit(int x)
{
	return x & -x;
}

void update(int id, int val)
{
	while (id <= n) {
		bit[id] += val;
		id += lowbit(id);
	}
}

int get_sum(int id)
{
	int sum = 0;
	while (id > 0) {
		sum += bit[id];
		id -= lowbit(id);
	}
	return sum;
}

int find_kth_small(int k)
{
	int now = 0, sum = 0;
	for (int i = 20; i >= 0; i--) {
		now += 1 << i;
		if (now > n || sum + bit[now] >= k)
			now -= 1 << i;
		else
			sum += bit[now];
	}
	return now + 1;
}

int find_kth_large(int k)
{
	return find_kth_small(num - k + 1);
}

int get_parent(int x)
{
	return (x == parent[x]) ? x : (parent[x] = get_parent(parent[x]));
}

void set_union(int x, int y)
{
	size[parent[x]] += size[parent[y]];
	parent[y] = parent[x];
	num--;
}

int main()
{
	std::scanf("%d%d", &n, &m);
	//std::cin >> n >> m;
	num = n;
	for (int i = 1; i <= n; i++) {
		parent[i] = i;
		size[i] = 1;
	}
	update(1, n);

	for (int i = 0, opt, x, y; i < m; i++) {
		std::scanf("%d", &opt);
		//std::cin >> opt;
		if (opt) {
			std::scanf("%d", &x);
			//std::cin >> x;
			//std::cout << find_kth_large(x) << '\n';
			std::printf("%d\n", find_kth_large(x));
		} else {
			std::scanf("%d%d", &x, &y);
			//std::cin >> x >> y;
			int f1 = get_parent(x);
			int f2 = get_parent(y);
			if (f1 == f2) continue;
			update(size[f1], -1);
			update(size[f2], -1);
			update(size[f1] + size[f2], 1);
			set_union(f1, f2);
		}
	}

}

